package gm.server.virtual.simulator2D;

import com.sun.scenario.scenegraph.SGGroup;
import com.sun.scenario.scenegraph.SGShape;
import com.sun.scenario.scenegraph.SGTransform;
import gm.server.Motor;
import java.awt.Color;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

/**
 * Motor komponens.
 *
 * @author imruf84
 */
public class MotorComponent extends Motor {

    /**
     * Síkidom transzformáció mátrixa.
     */
    final SGTransform.Affine transform = SGTransform.createAffine(null, null);
    /**
     * Csukló síkidomja.
     */
    final SGShape shape = new SGShape();
    /**
     * Transzformáció csoport.
     */
    final SGGroup transformGroup = new SGGroup();
    /**
     * Komponens.
     */
    final SGGroup component = new SGGroup();

    /**
     * Konstruktor.
     *
     * @param ID azonosító
     * @param name név
     * @param rpm sebesség
     * @param spr lépések száma fordulatonként
     */
    public MotorComponent(String ID, String name, double rpm, double spr) {
        super(ID, name, rpm, spr);
        createComponent();
    }

    /**
     * Komponens létrehozása.
     */
    private void createComponent() {

        double width = 20d;
        double height = 30d;

        shape.setShape(new Rectangle2D.Double(-width / 2d, -height, width, height));
        shape.setFillPaint(new Color(1f, 0, 0, 1f));
        shape.setAntialiasingHint(RenderingHints.VALUE_ANTIALIAS_ON);

        transformGroup.add(shape);
        transform.setChild(transformGroup);
        component.add(transform);

        updateTransform();
    }

    /**
     * Transzformáció frissítése.
     */
    private void updateTransform() {
        AffineTransform t = new AffineTransform();
        t.setToIdentity();
        transform.setAffine(t);
    }

    /**
     * Komponens frissítése.
     */
    public void updateComponent() {
        updateTransform();
    }

    /**
     * Komponens lekérdezése.
     *
     * @return komponens
     */
    public SGGroup getComponent() {
        return component;
    }

    /**
     * Beszúrás gyermekként.
     *
     * @param child gyermek
     */
    public void appendChild(SGGroup child) {
        transformGroup.add(child);
    }

}
